home *** CD-ROM | disk | FTP | other *** search
Wrap
-- card: 8218 from stack: in -- bmap block id: 0 -- flags: 0000 -- background id: 2607 -- name: TRIG.PAS -- part contents for background part 17 ----- text ----- ARCCOS[function] ARCSIN[function] ATAN2 [function] PURPOSE ARCCOS and ARCSIN of x return the inverse of the sin and cos fucntions for x. It is assumed abs(x) Γëñ 1. ATAN2(y,x) returns the arctan(y/x) in the correct quadrant. It is assumed x and y are not both zero. TYPE REQUIREMENTS Type FLOAT = REAL or DOUBLE or EXTENDED; CALLING PROCEDURE var X,Y,ASIN,ACOS:FLOAT;{Input for the functions} Define the input and call the functions. Z:=ATAN2(Y,X); Z:=ARCCOS(ACOS); Z:=ARCSIN(ASIN); EXAMPLE The example calculates and prints the various functions for x and y ranging form -5 to 5. The input for ARCCOS is x/sqrt(x*x+y*y). The input for ARCSIN is y/sqrt(x*x+y*y); REFERENCE VAX/VMS Runtime Library Reference Manual, Digital Equipment Corporation, 1982. -- part contents for background part 23 ----- text ----- TRIG.PAS -- part contents for background part 22 ----- text ----- TRIG.PAS -- part contents for background part 26 ----- text ----- 21 -- part contents for background part 6 ----- text ----- PROGRAM TEST_ACOS; TYPE FLOAT = REAL; FIXXED = INTEGER; VAR I, J : FIXXED; XIN, YIN, Z, AS, AC, AT : FLOAT; PROCEDURE see; VAR R : Rect; BEGIN HideAll; SetRect(R, 0, 35, 550, 330); SettextRect(R); Showtext; END; FUNCTION ARCCOS (U : FLOAT) : FLOAT; BEGIN IF ((0.0 < U) AND (U < 1.0)) THEN ARCCOS := ARCTAN(SQRT(1.0 - U * U) / U) ELSE IF ((-1.0 < U) AND (U < 0.0)) THEN ARCCOS := ARCTAN(SQRT(1.0 - U * U) / U) + 3.141592653589793238462643 ELSE IF U = -1.0 THEN ARCCOS := 3.141592653589793238462643 ELSE IF U = 1.0 THEN ARCCOS := 0.0 ELSE IF U = 0.0 THEN ARCCOS := 3.141592653589793238462643 / 2.0 ELSE ARCCOS := 0.0 / 0.0; END; FUNCTION ARCSIN (U : FLOAT) : FLOAT; BEGIN IF ((ABS(U) > 0.0) AND (ABS(U) < 1.0)) THEN ARCSIN := ARCTAN(U / SQRT(1.0 - U * U)) ELSE IF (U = 0.0) THEN ARCSIN := 0.0 ELSE IF (U = 1.0) THEN ARCSIN := +3.141592653589793238462643 / 2.0 ELSE IF (U = -1) THEN ARCSIN := -3.141592653589793238462643 / 2.0 ELSE ARCSIN := 0.0 / 0.0; END; FUNCTION ATAN2 (Y, X : FLOAT) : FLOAT; BEGIN IF ((X = 0.0) AND (Y > 0.0)) THEN ATAN2 := 3.141592653589793238462643 / 2.0 ELSE IF ((X = 0.0) AND (Y < 0.0)) THEN ATAN2 := -3.141592653589793238462643 / 2.0 ELSE IF (X > 0.0) THEN ATAN2 := ARCTAN(Y / X) ELSE IF ((X < 0.0) AND (Y > 0.0)) THEN ATAN2 := ARCTAN(Y / X) + 3.141592653589793238462643 ELSE IF ((X < 0.0) AND (Y < 0.0)) THEN ATAN2 := ARCTAN(Y / X) - 3.141592653589793238462643 ELSE IF ((X < 0.0) AND (Y = 0.0)) THEN ATAN2 := 3.141592653589793238462643 ELSE ATAN2 := 0.0 / 0.0; END; BEGIN SEE; FOR I := -5 TO 5 DO BEGIN FOR J := -5 TO 5 DO IF (NOT ((I = 0) AND (J = 0))) THEN BEGIN XIN := I; YIN := J; Z := SQRT(XIN * XIN + YIN * YIN); AS := ARCSIN(YIN / Z); AC := ARCCOS(XIN / Z); AT := ATAN2(YIN, XIN); WRITELN(' (X,Y) ', XIN : 10 : 5, YIN : 10 : 5); WRITELN(' ARCSIN ', AS : 20 : 10, ' ARCCOS', AC : 20 : 10, ' ATAN2', AT : 20 : 10); END; END; END.